# 导入必要的模块
import json  # 用于读写JSON数据
import os  # 用于操作文件系统
import random  # 用于生成随机数


# 根据卡号获取账户
def get_account_by_card_id(card_id, accounts):
    for account in accounts:
        if account['card_id'] == card_id:
            return account
    return None


# 显示账户信息
def show_account(account):
    # 打印账户信息
    print("================当前账户信息如下==================")
    print(f"卡号: {account['card_id']}")
    print(f"户主: {account['user_name']}")
    print(f"余额: {account['money']}")
    print(f"限额: {account['quota_money']}")


# 注册一个新账户
def register(accounts):
    # 输出开户提示信息
    print("================系统开户操作==================")
    user_name = input("请您输入账户用户名: ")  # 输入用户名

    while True:
        password = input("请您输入账户密码: ")  # 输入密码
        ok_password = input("请您输入确认密码: ")  # 再次输入密码确认
        if ok_password == password:  # 检查两次密码是否一致
            break
        else:
            print("对不起，您输入的2次密码不一致，请重新确认！")  # 输出密码不一致提示

    quota_money = float(input("请您当次限额: "))  # 输入限额

    card_id = get_random_card_id(accounts)  # 生成一个随机的8位卡号

    account = {
        'card_id': card_id,
        'user_name': user_name,
        'password': password,
        'money': 0,
        'quota_money': quota_money
    }  # 创建账户字典
    accounts.append(account)  # 将新注册的账户添加到账户列表中
    print(f"恭喜您，{user_name}先生/女士，您开户成功：您的卡号是：{card_id}, 请您妥善保管卡号")  # 输出开户成功提示


# 生成一个随机的8位卡号，确保与已有卡号不重复
def get_random_card_id(accounts):
    while True:
        card_id = ''.join([str(random.randint(0, 9)) for _ in range(8)])  # 生成一个随机的8位数字
        if get_account_by_card_id(card_id, accounts) is None:  # 检查卡号是否已存在
            return card_id  # 返回生成的卡号


# 账户登录
def login(accounts):
    # 输出登录提示信息
    print("=======================系统登录操作======================")
    if len(accounts) == 0:  # 检查账户列表是否为空
        print("对不起，当前系统中无任何账户，请先开户再来登录")  # 输出无账户提示
        return None

    while True:
        card_id = input("请您输入卡号: ")  # 输入卡号
        account = get_account_by_card_id(card_id, accounts)  # 根据卡号获取账户信息
        if account is not None:  # 如果账户存在
            while True:
                password = input("请您输入登录密码: ")  # 输入登录密码
                if account['password'] == password:  # 检查密码是否正确
                    print(f"恭喜您：{account['user_name']}先生/女士进入系统，您的卡号是{account['card_id']}")  # 登录成功提示
                    return account  # 返回账户信息
                else:
                    print("您输入的密码有误！")  # 输出密码错误提示
        else:
            print("系统中不存在该账户卡号!")  # 输出账户不存在提示


# 显示用户的操作菜单
def show_user_command(account, accounts):
    while True:
        print("=====================用户操作页======================")
        print("1.查询账户")
        print("2.存款")
        print("3.取款")
        print("4.转账")
        print("5.修改密码")
        print("6.退出")
        print("7.注销账户")
        command = int(input("请选择："))  # 输入指令
        if command == 1:
            show_account(account)  # 显示账户信息
        elif command == 2:
            deposit_money(account)  # 存款操作
        elif command == 3:
            draw_money(account)  # 取款操作
        elif command == 4:
            transfer_money(account, accounts)  # 转账操作
        elif command == 5:
            update_password(account)  # 修改密码操作
            return
        elif command == 6:
            print("退出成功，欢迎下次登录")  # 退出提示
            return
        elif command == 7:
            delete_account(account, accounts)  # 销户操作
            return
        else:
            print("您输入的操作命令不正确")  # 输出指令不正确提示


# 存款操作
def deposit_money(account):
    # 输出存钱提示信息
    print("==================用户存钱操作====================")
    money = float(input("请输入存款金额: "))  # 输入存款金额
    account['money'] += money  # 将存款金额添加到账户余额中
    print("恭喜您，存钱成功，当前账户信息如下：")  # 存钱成功提示
    show_account(account)  # 显示账户信息


# 取款操作
def draw_money(account):
    # 输出取钱提示信息
    print("==================用户取钱功能====================")
    if account['money'] < 100:  # 检查账户余额是否低于100元
        print("对不起，当前账户余额中不足100元，不能取钱~")  # 输出余额不足100元提示
        return

    while True:
        money = float(input("请输入取款金额: "))  # 输入取款金额
        if money > account['quota_money']:  # 检查取款金额是否超过限额
            print(f"对不起，您当前取款金额超过每次限额，每次最多可取{account['quota_money']}")  # 输出超出限额提示
        elif money > account['money']:  # 检查取款金额是否超过账户余额
            print(f"余额不足,您账户总余额是：{account['money']}")  # 输出余额不足提示
        else:
            print(f"恭喜你，取钱{money}成功！")  # 输出取款成功提示
            account['money'] -= money  # 从账户余额中扣除取款金额
            show_account(account)  # 显示账户信息
            return


# 转账操作
def transfer_money(account, accounts):
    # 输出转账提示信息
    print("==================用户转账操作====================")
    if len(accounts) < 2:  # 检查账户列表是否少于2个账户
        print("当前系统中，不足2个账户，不能进行转账，请去开户")  # 输出账户不足2个提示
        return

    if account['money'] == 0:  # 检查账户余额是否为0
        print("对不起，您自己都没钱，就别转了")  # 输出无法转账提示
        return

    while True:
        card_id = input("请您输入对方账户的卡号: ")  # 输入对方账户的卡号
        if card_id == account['card_id']:  # 检查对方账户是否为自己账户
            print("对不起，您不可以给自己转账")  # 输出不能给自己转账提示
            continue

        target_account = get_account_by_card_id(card_id, accounts)  # 根据卡号获取对方账户信息
        if target_account is None:  # 检查对方账户是否存在
            print("对不起，输入的账户不存在~")  # 输出账户不存在提示
        else:
            user_name = target_account['user_name']  # 获取对方账户的户主姓名
            tip = "*" + user_name[1:]  # 获取户主姓氏的首字母
            pre_name = input(f"请您输入[{tip}]的姓氏: ")  # 输入户主姓氏的首字母
            if user_name.startswith(pre_name):  # 检查户主姓氏首字母是否与输入一致
                while True:
                    money = float(input("请您输入转账金额: "))  # 输入转账金额
                    if money > account['money'] or money > account['quota_money']:  # 检查转账金额是否超过余额或限额
                        print(f"余额不足或超出转账限额，最多转账{account['quota_money']}")  # 输出余额不足或超出限额提示
                        print(f"您的余额为：{account['money']}")  # 输出当前余额
                    else:
                        account['money'] -= money  # 从自己账户中扣除转账金额
                        target_account['money'] += money  # 向对方账户中添加转账金额
                        print(f"转账成功：您的账户还剩余：{account['money']}")  # 输出转账成功提示
                        return
            else:
                print("对不起，输入的信息有误")  # 输出输入信息有误提示


# 修改密码操作
def update_password(account):
    # 输出密码修改提示信息
    print("==================用户密码修改====================")
    while True:
        password = input("请您输入当前密码: ")  # 输入当前密码
        if account['password'] == password:  # 检查当前密码是否正确
            while True:
                new_password = input("请您输入新密码: ")  # 输入新密码
                ok_password = input("请您确认新密码: ")  # 再次输入新密码确认
                if new_password == ok_password:  # 检查两次新密码是否一致
                    account['password'] = new_password  # 更新密码为新密码
                    print("恭喜您，密码修改成功！")  # 输出密码修改成功提示
                    return
                else:
                    print("2次输入密码不一致，重新输入密码")  # 输出两次输入密码不一致提示
        else:
            print("您输入的密码不正确")  # 输出密码不正确提示


# 销户操作
def delete_account(account, accounts):
    # 输出销户提示信息
    print("==================用户销户====================")
    rs = input("您真的要销户？y/n: ")  # 输入是否要销户
    if rs.lower() == "y":  # 如果输入为"y"
        if account['money'] > 0:  # 检查账户余额是否大于0
            print("您账户中还有钱没有取完，不允许销户")  # 输出账户有余额不能销户的提示
        else:
            accounts.remove(account)  # 从账户列表中移除销户的账户
            print("您的账户销户完成！")  # 输出销户完成提示
    else:
        print("好的，当前账户保留")  # 输出账户保留提示


# 从文件中读取账户信息
def load_accounts(filename):
    if os.path.exists(filename):  # 检查文件是否存在
        with open(filename, 'r') as file:  # 使用with语句打开文件，确保文件正常关闭
            data = json.load(file)  # 从文件中读取数据
            return data  # 返回读取的数据
    return []  # 如果文件不存在，返回一个空列表


# 将账户信息保存到文件中
def save_accounts(accounts, filename):
    with open(filename, 'w') as file:  # 使用with语句打开文件，确保文件正常关闭
        json.dump(accounts, file, indent=4)  # 将数据写入文件，指定缩进为4个空格


# 主函数
def main():
    filename = 'accounts.json'  # 定义文件名
    accounts = load_accounts(filename)  # 从文件中读取账户信息
    while True:
        print("====================自动存取款机系统==================")
        print("1.账户登录")
        print("2.账户注册")
        command = int(input("请选择您的操作："))  # 输入指令
        if command == 1:
            account = login(accounts)  # 登录账户
            if account:
                show_user_command(account, accounts)  # 显示用户操作菜单
        elif command == 2:
            register(accounts)  # 注册新账户
        else:
            print("您输入的指令不存在~~")  # 输出指令不存在提示
        save_accounts(accounts, filename)  # 将账户信息保存到文件中


if __name__ == "__main__":
    main()  # 调用主函数